package com.handinfo.android.uicontrols.controls;

import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.PointF;
import android.view.MotionEvent;

import com.handinfo.android.DWGameManager;
import com.handinfo.android.core.graphics.DWGraphics;
import com.handinfo.android.uicontrols.DWControlsManager;
import com.handinfo.android.uicontrols.DWDragListener;
import com.handinfo.android.uicontrols.DWListener;
import com.handinfo.android.uicontrols.DWLongListener;
import com.handinfo.android.utils.Tools;

/**
 * 控件父类
 * @author handinfo
 */
public abstract class DWControl
{
	/** 依赖的Control */
	private DWControl m_rely_control = null;
	/** 监听类 */
	protected DWListener m_listener = null;
	/** 拖拽监听 */
	protected DWDragListener m_drag_listener = null;
	/** 长按监听 */
	protected DWLongListener m_long_listener = null;
	/** 背景图片 */
	protected Bitmap img_background = null;
	/** 名字 */
	protected String m_name = null;
	/** 偏移值x */
	protected float m_deviant_x = 0;//偏移值
	/** 偏移值y */
	protected float m_deviant_y = 0;//偏移值
	/** 锚点 */
	protected int m_anchor = 0;
	/** 索引ID */
	protected int m_id = 0;
	/** 坐标x */
	protected int m_show_x = 0;
	/** 坐标y */
	protected int m_show_y = 0;
	/** 显示宽度 */
	protected int m_show_w = 0;
	/** 显示高度 */
	protected int m_show_h = 0;
	/** 实际宽度 */
	protected int m_actual_w = 0;
	/** 实际高度 */
	protected int m_actual_h = 0;
	/** 触摸扩大像素 */
	private int m_touch_pixel_x = 0;
	/** 触摸扩大像素 */
	private int m_touch_pixel_y = 0;
	/** 停靠控件时自己的锚点 */
	protected int m_near_own_anchor = 0;
	/** 停靠控件时目标的锚点 */
	protected int m_near_tar_anchor = 0;
	/** 停靠控件时横向偏移值 */
	protected int m_near_interspace_x = 0;
	/** 停靠控件时纵向偏移值 */
	protected int m_near_interspace_y = 0;
	/** 停靠的控件 */
	protected DWControl m_near_control = null;
	/** 锚点停靠的控件 */
	protected DWControl m_anchor_control = null;
	/** 锚点停靠的横向空隙 */
	protected int m_anchor_interspace_x = 0;
	/** 锚点停靠的纵向空隙 */
	protected int m_anchor_interspace_y = 0;
	/** 是否销毁 */
	protected boolean m_is_deal = false;
	/** 此控件是否可以触摸 */
	protected boolean m_is_touch = true;
	/** 此控件是否可见 */
	protected boolean m_is_show = true;
	/** 此控件是否显示外边框 */
	protected boolean m_is_rect = false;
	/** 此控件是否置顶 */
	protected boolean m_is_top = false;
	/** 此控件是否开启引导 */
	protected boolean m_is_guide = false;
	
	/** 出现的类型 - 无 */
	public static final byte DISPLAY_TYPE_NONE = 0;
	/** 出现的类型 - 放大 */
	public static final byte DISPLAY_TYPE_SCALING = 1;
	/** 出现的类型 */
	protected byte m_display_type = DISPLAY_TYPE_NONE;
	
	/** 是否开始从小到大的过程 */
	protected boolean m_is_scaling = false;
	/** 放大过程序列 */
	protected final float[] SCALING_LIST = new float[] {0.7f, 0.9f, 1};
	/** 放大过程下标 */
	protected int m_scaling_index = 0;

	
	/**
	 * 构造方法
	 */
	public DWControl()
	{
	}

	/**
	 * 设置坐标
	 * @param x
	 * @param y
	 */
	public void setPoint(int x, int y)
	{
		m_show_x = x;
		m_show_y = y;
		changeAfter();
	}

	/**
	 * 设置坐标,不需要重置数据
	 * @param x
	 * @param y
	 */
	public void setPointUn(int x, int y)
	{
		m_show_x = x;
		m_show_y = y;
	}

	/**
	 * 设置显示宽高
	 * @param w
	 * @param h
	 */
	public void setShowWideHigh(int w, int h)
	{
		m_show_w = w;
		m_show_h = h;
		changeAfter();
	}

	/**
	 * 设置显示宽高,不要重置数据
	 * @param w
	 * @param h
	 */
	public void setShowWideHighUn(int w, int h)
	{
		m_show_w = w;
		m_show_h = h;
	}

	/**
	 * 设置实际宽高
	 * @param w
	 * @param h
	 */
	public void setActualWideHigh(int w, int h)
	{
		m_actual_w = w;
		m_actual_h = h;
	}

	/**
	 * 设置触摸区域放大像素,设置触摸区域时需要将显示的x,y,w,h设置完毕.
	 * @param pixelX X方向扩大像素
	 * @param pixelY Y方向扩大像素
	 */
	public void setTouchZoomIn(int pixelX, int pixelY)
	{
		m_touch_pixel_x = pixelX;
		m_touch_pixel_y = pixelY;
	}

	/**
	 * 得到宽度
	 * @return
	 */
	public int getShowWidth()
	{
		return m_show_w;
	}

	/**
	 * 得到高度
	 * @return
	 */
	public int getShowHeight()
	{
		return m_show_h;
	}
	
	public int getShowX() {
		return m_show_x;
	}
	
	public int getShowY() {
		return m_show_y;
	}

	/**
	 * 设置ID
	 * @param id
	 */
	public void setID(int id)
	{
		m_id = id;
	}

	/**
	 * 得到ID
	 * @return
	 */
	public int getID()
	{
		return m_id;
	}

	/**
	 * 比较ID
	 * @param id
	 * @return
	 */
	public boolean equalsID(int id)
	{
		return m_id == id;
	}

	/**
	 * 设置名字
	 * @param name
	 */
	public void setName(String name)
	{
		m_name = name;
	}

	/**
	 * 得到名字
	 * @return
	 */
	public String getName()
	{
		return m_name;
	}

	/**
	 * 控件名字是否为空
	 * @return
	 */
	public boolean isNoName()
	{
		if (m_name == null || m_name.equals("")) {
			return true;
		}
		return false;
	}

	/**
	 * 销毁自己
	 */
	public void destruct()
	{
		m_is_deal = true;
	}

	/**
	 * 得到是否要销毁
	 * @return
	 */
	public boolean getDeal()
	{
		return m_is_deal;
	}
	
	public void setDeal(boolean deal) {
		m_is_deal = deal;
	}
	
	/**
	 * 设置控件是否显示
	 * @param show
	 */
	public void setShow(boolean show) {
		m_is_show = show;
	}
	
	/**
	 * 得到是否显示
	 * @return
	 */
	public boolean isShow() {
		return m_is_show;
	}
	
	/**
	 * 设置控件是否可以触摸
	 * @param touch
	 */
	public void setTouch(boolean touch) {
		m_is_touch = touch;
	}
	
	/**
	 * 设置是否开始放大
	 * @param scaling
	 */
	public void setScaling(boolean scaling) {
		m_is_scaling = scaling;
		if (m_is_scaling) {
			m_scaling_index = 0;
		} else {
			m_scaling_index = SCALING_LIST.length - 1;
		}
	}
	
	/**
	 * 得到是否开始放大
	 * @return
	 */
	public boolean getScaling() {
		return m_is_scaling;
	}
	
	/**
	 * 得到缩放的比例
	 * @return
	 */
	public float getScalingValue() {
		return SCALING_LIST[m_scaling_index++];
	}
	
	/**
	 * 得到是否还可以缩放
	 * @return
	 */
	public boolean isScaling() {
		if (m_scaling_index >= SCALING_LIST.length) {
			m_is_scaling = false;
			return false;
		}
		return true;
	}
	
	/**
	 * 设置出现类型
	 * @param type
	 */
	public void setDisplayType(byte type) {
		m_display_type = type;
	}
	
	/**
	 * 得到出现类型
	 */
	public byte getDisplayType() {
		return m_display_type;
	}

	/**
	 * 设置一张背景图片
	 * @param image
	 * @param changeWH 是否需要根据背景改变宽度,高度,如果改变那么关联的x,y控件需要重新刷新
	 */
	public void setBackground(Bitmap image, boolean changeWH)
	{
		if (image == null) {
			return;
		}
		img_background = image;
		if (changeWH) {
			setShowWideHigh(image.getWidth(), image.getHeight());
		}
	}
	
	/**
	 * 设置是否置顶
	 * @param top
	 */
	public void setTop(boolean top) {
		m_is_top = top;
	}
	
	/**
	 * 得到此控件是否置顶
	 * @return
	 */
	public boolean getTop() {
		return m_is_top;
	}
	
	/**
	 * 设置是否显示引导
	 * @param guide
	 */
	public void setGuide(boolean guide) {
		if (m_is_guide && !guide) {
			if (DWControlsManager.getInstance() != null) {
				DWControlsManager.getInstance().m_guides.nextFrame();
			}
		}
		m_is_guide = guide;
	}
	
	public void closeGuide() {
		m_is_guide = false;
	}

//	/**
//	 * 设置默认锚点的停靠
//	 */
//	public void setDefaultAnchor() {
//		setAnchor(m_anchor_control, m_anchor, m_anchor_interspace_x, m_anchor_interspace_y);
//	}
//	/**
//	 * 设置锚点,对某一个控件进行锚点停靠
//	 * @param anchor
//	 */
//	public void setAnchor(int anchor, DWControl control) {
//		setAnchor(control, anchor, 0, 0);
//	}
//	/**
//	 * 设置锚点,对某一个控件进行锚点停靠
//	 * @param control
//	 * @param anchor
//	 * @param interspaceX
//	 * @param interspaceY
//	 */
//	public void setAnchor(DWControl control, int anchor, int interspaceX, int interspaceY) {
//		if (control == null) {
//			return;
//		}
//		
//		m_anchor = anchor;
//		m_anchor_control = control;
//		m_anchor_interspace_x = interspaceX;
//		m_anchor_interspace_y = interspaceY;
//		
//		//x锚点
//		if ((anchor & Tools.LEFT) != 0) {
//			m_show_x = control.m_show_x;
//		} else if ((anchor & Tools.RIGHT) != 0) {
//			m_show_x = control.m_show_x + control.m_show_w - m_show_w;
//		} else if ((anchor & Tools.HCENTER) != 0) {
//			m_show_x = control.m_show_x + ((control.m_show_w - m_show_w) >> 1);
//		}
//		//y锚点
//		if ((anchor & Tools.TOP) != 0) {
//			m_show_y = control.m_show_y;
//		} else if ((anchor & Tools.BOTTOM) != 0) {
//			m_show_y = control.m_show_y + control.m_show_h - m_show_h;
//		} else if ((anchor & Tools.VCENTER) != 0) {
//			m_show_y = control.m_show_y + ((control.m_show_h - m_show_h) >> 1);
//		}
//		
//		m_show_x += interspaceX;
//		m_show_y += interspaceY;
//		
//		changeAfter();
//	}

//	/**
//	 * 设置默认锚点的停靠
//	 */
//	public void setDefaultAnchorUn() {
//		setAnchorUn(m_anchor_control, m_anchor, m_anchor_interspace_x, m_anchor_interspace_y);
//	}
//	/**
//	 * 设置锚点,对某一个控件进行锚点停靠
//	 * @param anchor
//	 */
//	public void setAnchorUn(int anchor, DWControl control) {
//		setAnchorUn(control, anchor, 0, 0);
//	}
//	/**
//	 * 设置锚点,对某一个控件进行锚点停靠
//	 * @param control
//	 * @param anchor
//	 * @param interspaceX
//	 * @param interspaceY
//	 */
//	public void setAnchorUn(DWControl control, int anchor, int interspaceX, int interspaceY) {
//		if (control == null) {
//			return;
//		}
//		
//		m_anchor = anchor;
//		m_anchor_control = control;
//		m_anchor_interspace_x = interspaceX;
//		m_anchor_interspace_y = interspaceY;
//		
//		//x锚点
//		if ((anchor & Tools.LEFT) != 0) {
//			m_show_x = control.m_show_x;
//		} else if ((anchor & Tools.RIGHT) != 0) {
//			m_show_x = control.m_show_x + control.m_show_w - m_show_w;
//		} else if ((anchor & Tools.HCENTER) != 0) {
//			m_show_x = control.m_show_x + ((control.m_show_w - m_show_w) >> 1);
//		}
//		//y锚点
//		if ((anchor & Tools.TOP) != 0) {
//			m_show_y = control.m_show_y;
//		} else if ((anchor & Tools.BOTTOM) != 0) {
//			m_show_y = control.m_show_y + control.m_show_h - m_show_h;
//		} else if ((anchor & Tools.VCENTER) != 0) {
//			m_show_y = control.m_show_y + ((control.m_show_h - m_show_h) >> 1);
//		}
//		
//		m_show_x += interspaceX;
//		m_show_y += interspaceY;
//	}

	/**
	 * 以默认设置靠近某个控件
	 */
	public void setDefaultNearAnchor()
	{
		if (m_near_control != null) {
			setNearAnchor(m_near_control, m_near_own_anchor, m_near_tar_anchor, m_near_interspace_x,
					m_near_interspace_y);
		}
	}

	/**
	 * 设置靠近某个控件,设置之前必须保证将要靠近控件的x,y,w,h,以及自身的w,h
	 * @param control 需要靠近的控件
	 * @param ownAnchor 以自己的锚点
	 * @param targetAnchor 靠近控件的锚点
	 */
	public void setNearAnchor(DWControl control, int ownAnchor, int targetAnchor)
	{
		setNearAnchor(control, ownAnchor, targetAnchor, 0, 0);
	}

	/**
	 * 设置靠近某个控件,设置之前必须保证将要靠近控件的x,y,w,h,以及自身的w,h
	 * @param control 需要靠近的控件
	 * @param ownAnchor 以自己的锚点
	 * @param targetAnchor 靠近控件的锚点
	 * @param interspace 空隙
	 */
	public void setNearAnchor(DWControl control, int ownAnchor, int targetAnchor, int interspaceX, int interspaceY)
	{

		if (control == null) {
			return;
		}

		//保留停靠的属性
		m_near_control = control;
		m_near_own_anchor = ownAnchor;
		m_near_tar_anchor = targetAnchor;
		m_near_interspace_x = interspaceX;
		m_near_interspace_y = interspaceY;

		//计算目标x锚点
		if ((targetAnchor & Tools.LEFT) != 0) {
			m_show_x = control.m_show_x;
		}
		else if ((targetAnchor & Tools.RIGHT) != 0) {
			m_show_x = control.m_show_x + control.m_show_w;
		}
		else if ((targetAnchor & Tools.HCENTER) != 0) {
			m_show_x = control.m_show_x + (control.m_show_w >> 1);
		}
		//计算目标y锚点
		if ((targetAnchor & Tools.TOP) != 0) {
			m_show_y = control.m_show_y;
		}
		else if ((targetAnchor & Tools.BOTTOM) != 0) {
			m_show_y = control.m_show_y + control.m_show_h;
		}
		else if ((targetAnchor & Tools.VCENTER) != 0) {
			m_show_y = control.m_show_y + (control.m_show_h >> 1);
		}

		//计算自己x锚点
		if ((ownAnchor & Tools.LEFT) != 0) {
			m_show_x -= 0;
		}
		else if ((ownAnchor & Tools.RIGHT) != 0) {
			m_show_x -= m_show_w;
		}
		else if ((ownAnchor & Tools.HCENTER) != 0) {
			m_show_x -= (m_show_w >> 1);
		}
		//计算自己y锚点
		if ((ownAnchor & Tools.TOP) != 0) {
			m_show_y -= 0;
		}
		else if ((ownAnchor & Tools.BOTTOM) != 0) {
			m_show_y -= m_show_h;
		}
		else if ((ownAnchor & Tools.VCENTER) != 0) {
			m_show_y -= (m_show_h >> 1);
		}

		//计算偏移值
		m_show_x += interspaceX;
		m_show_y += interspaceY;

		//设置属性后的重置数据
		changeAfter();
	}

	/**
	 * 以默认设置靠近某个控件
	 */
	public void setDefaultNearAnchorUn()
	{
		if (m_near_control != null) {
			setNearAnchorUn(m_near_control, m_near_own_anchor, m_near_tar_anchor, m_near_interspace_x,
					m_near_interspace_y);
		}
	}

	/**
	 * 设置靠近某个控件,设置之前必须保证将要靠近控件的x,y,w,h,以及自身的w,h
	 * @param control 需要靠近的控件
	 * @param ownAnchor 以自己的锚点
	 * @param targetAnchor 靠近控件的锚点
	 */
	public void setNearAnchorUn(DWControl control, int ownAnchor, int targetAnchor)
	{
		setNearAnchorUn(control, ownAnchor, targetAnchor, 0, 0);
	}

	/**
	 * 设置靠近某个控件,设置之前必须保证将要靠近控件的x,y,w,h,以及自身的w,h
	 * @param control 需要靠近的控件
	 * @param ownAnchor 以自己的锚点
	 * @param targetAnchor 靠近控件的锚点
	 * @param interspace 空隙
	 */
	public void setNearAnchorUn(DWControl control, int ownAnchor, int targetAnchor, int interspaceX, int interspaceY)
	{

		if (control == null) {
			return;
		}
		
		//保留停靠的属性
		m_near_control = control;
		m_near_own_anchor = ownAnchor;
		m_near_tar_anchor = targetAnchor;
		m_near_interspace_x = interspaceX;
		m_near_interspace_y = interspaceY;

		//计算目标x锚点
		if ((targetAnchor & Tools.LEFT) != 0) {
			m_show_x = control.m_show_x;
		}
		else if ((targetAnchor & Tools.RIGHT) != 0) {
			m_show_x = control.m_show_x + control.m_show_w;
		}
		else if ((targetAnchor & Tools.HCENTER) != 0) {
			m_show_x = control.m_show_x + (control.m_show_w >> 1);
		}
		//计算目标y锚点
		if ((targetAnchor & Tools.TOP) != 0) {
			m_show_y = control.m_show_y;
		}
		else if ((targetAnchor & Tools.BOTTOM) != 0) {
			m_show_y = control.m_show_y + control.m_show_h;
		}
		else if ((targetAnchor & Tools.VCENTER) != 0) {
			m_show_y = control.m_show_y + (control.m_show_h >> 1);
		}

		//计算自己x锚点
		if ((ownAnchor & Tools.LEFT) != 0) {
			m_show_x -= 0;
		}
		else if ((ownAnchor & Tools.RIGHT) != 0) {
			m_show_x -= m_show_w;
		}
		else if ((ownAnchor & Tools.HCENTER) != 0) {
			m_show_x -= (m_show_w >> 1);
		}
		//计算自己y锚点
		if ((ownAnchor & Tools.TOP) != 0) {
			m_show_y -= 0;
		}
		else if ((ownAnchor & Tools.BOTTOM) != 0) {
			m_show_y -= m_show_h;
		}
		else if ((ownAnchor & Tools.VCENTER) != 0) {
			m_show_y -= (m_show_h >> 1);
		}

		//计算偏移值
		m_show_x += interspaceX;
		m_show_y += interspaceY;
	}

	/**
	 * 居中显示
	 */
	public void setCentre()
	{
		m_show_x = (DWGameManager.Screen_Width - m_show_w) >> 1;
		m_show_y = (DWGameManager.Screen_Height - m_show_h) >> 1;
	}

	/**
	 * 设置依赖控件,指父类层级控件
	 * @param control
	 */
	public void setRelyControl(DWControl control)
	{
		m_rely_control = control;
	}

	/**
	 * 通知依赖控件刷新宽高
	 */
	public void refreshControl()
	{
		if (m_rely_control != null) {
			m_rely_control.refreshControl();
		}
	}

	/**
	 * 得到依赖控件,父类层级控件
	 * @return
	 */
	public DWControl getRelyControl()
	{
		return m_rely_control;
	}
	/**
	 * 设置默认切割
	 * @param g
	 */
	public void setClip(DWGraphics g) {
		g.setClip(m_show_x, m_show_y, m_show_w, m_show_h);
	}
	/**
	 * 设置子类控件的切割范围
	 * @param g
	 * @param x
	 * @param y
	 * @param w
	 * @param h
	 * @param offsetx
	 * @param offsety
	 */
	public byte setSubClip(DWGraphics g, int x, int y, int w, int h, int offsetx, int offsety)
	{
		int lastX = x + m_show_x - offsetx;
		int lastY = y + m_show_y - offsety;
		int lastW = m_show_w;
		int lastH = m_show_h;
		
		//上,超出边界
		if (m_show_y - offsety < 0) {
			lastY = y;
			lastH = m_show_h + (m_show_y - offsety);
			if (lastH < 0) {
				lastH = 0;
			}
		}
		//下,超出边界
		if (m_show_y - offsety + m_show_h > h) {
			lastH = y + h - lastY + 1;
			if (lastH < 0) {
				lastH = 0;
			}
		}
		//左,超出边界
		if (m_show_x - offsetx < 0) {
			lastX = x;
			lastW = m_show_w + (m_show_x - offsetx);
			if (lastW < 0) {
				lastW = 0;
			}
		}
		//右,超出边界
		if (m_show_x - offsetx + m_show_w > w) {
			lastW = x + w - lastX + 1;
			if (lastW < 0) {
				lastW = 0;
			}
		}
		g.setClip(lastX, lastY, lastW, lastH);
		
		
		
//		if (y + (m_show_y - offsety) < y) {//m_show_y超出y范围
//			int value = y + m_show_y - offsety + m_show_h - y;
//			if (value > 0) {
//				g.setClip(x + m_show_x, y, m_show_w, value);
//				return 0;
//			}
//		}
//		else if (y + (m_show_y - offsety + m_show_h) > y + h) {//m_show_h超出h范围
//			int value = y + h - (y + m_show_y - offsety);
//			if (value > 0) {
//				g.setClip(x + m_show_x, y + m_show_y - offsety, m_show_w, value);
//				return 1;
//			}
//		}
//		else {//没有超出范围
//			g.setClip(x + m_show_x, y + m_show_y - offsety, m_show_w, m_show_h);
//		}
		return -1;
	}

//	/**
//	 * 绘制触摸区域
//	 * @param g
//	 */
//	public void renderTouchRect(DWGraphics g) {
//		g.setColor(Tools.GREEN);
//		g.setClip(m_touch_x, m_touch_y, m_touch_w + 1, m_touch_h + 1);
//		g.drawRect(m_touch_x, m_touch_y, m_touch_w, m_touch_h);
//	}

	/**
	 * 在一些变量改变之后需要重置的数据
	 */
	public void changeAfter()
	{
		refreshControl();
	}

	/**
	 * 检测点是否在框内
	 * @param x
	 * @param y
	 * @return
	 */
	public boolean checkPointOnRect(float x, float y)
	{
		if (m_is_touch && x >= (m_show_x - m_touch_pixel_x) && x <= m_show_x + m_show_w + m_touch_pixel_x
				&& y >= m_show_y - m_touch_pixel_y && y <= m_show_y + m_show_h + m_touch_pixel_y) {
			return true;
		}
		return false;
	}

	/**
	 * 添加一个监听
	 * @param listener
	 */
	public void addListener(DWListener listener)
	{
		if (listener == null) {
			throw new NullPointerException("add listener is null!");
		}
		m_listener = listener;
	}
	
	/**
	 * 添加一个拖拽监听
	 * @param drag_lis
	 */
	public void addDragListener(DWDragListener drag_lis) {
		if (drag_lis == null) {
			throw new NullPointerException("add drag listener is null!");
		}
		m_drag_listener = drag_lis;
	}
	/**
	 * 添加一个长按监听
	 * @param long_lis
	 */
	public void addLongListener(DWLongListener long_lis) {
		if (long_lis == null) {
			throw new NullPointerException("add long listener is null!");
		}
		m_long_listener = long_lis;
	}
	
	/**
	 * 得到长按监听
	 * @return
	 */
	public DWLongListener getLongListener() {
		return m_long_listener;
	}

	/**
	 * 按下移动
	 * @param start
	 * @param end
	 */
	public boolean doScroll(PointF start, PointF end, float distanceX, float distanceY)
	{
		if (checkPointOnRect(start.x, start.y)) {
			return true;
		}
		return false;
	}

	/**
	 * 按下
	 * @param point
	 * @return
	 */
	public boolean doDown(PointF point)
	{
		if (checkPointOnRect(point.x, point.y)) {
			return true;
		}
		return false;
	}

	/**
	 * 双击
	 * @param pointX
	 * @param pointY
	 * @return
	 */
	public boolean doDoubleClick(PointF point)
	{
		if (checkPointOnRect(point.x, point.y)) {
			return true;
		}
		return false;
	}

	/**
	 * 长按
	 * @param point
	 * @return
	 */
	public boolean doLongPress(PointF point)
	{
		if (checkPointOnRect(point.x, point.y)) {
			return true;
		}
		return false;
	}

	/**
	 * 长按移动
	 * @param start
	 * @param end
	 * @param distanceX
	 * @param distanceY
	 * @return
	 */
	public boolean doLongScroll(PointF start, PointF end, float distanceX, float distanceY)
	{
		if (checkPointOnRect(start.x, start.y)) {
			return true;
		}
		return false;
	}

	/**
	 * 按下移动抬起
	 * @param start
	 * @param end
	 * @param velocityX
	 * @param velocityY
	 * @return
	 */
	public boolean doFling(PointF start, PointF end, float velocityX, float velocityY)
	{
		if (checkPointOnRect(start.x, start.y)) {
			return true;
		}
		return false;
	}

	/**
	 * 长按移动抬起
	 * @param start
	 * @param end
	 * @param velocityX
	 * @param velocityY
	 * @return
	 */
	public boolean doDrag(PointF start, PointF end, float velocityX, float velocityY)
	{
		if (checkPointOnRect(end.x, end.y)) {
			return true;
		}
		return false;
	}
	
	public boolean onTouch(MotionEvent event, PointF point)
	{
		return false;
	}

	/**
	 * 将此控件绘制在x,y,w,h的范围内,多余部分将不显示.
	 * @param g
	 */
	public void renderLimits(DWGraphics g, int x, int y, int w, int h, int offsetx, int offsety)
	{
	}
	
	/**
	 * 绘制引导
	 * @param g
	 */
	public void renderGuide(DWGraphics g) {
		if (m_is_guide) {
			if (DWControlsManager.getInstance() != null) {
				DWControlsManager.getInstance().m_guide_control = this;
				DWControlsManager.getInstance().setGuidePoint(m_show_x, m_show_y, m_show_w, m_show_h);
			}
//			DWGuideObject guide = DWControlsManager.getInstance().m_guides.getCurrentGuideObject();
//			if (guide != null) {
//				guide.draw(g, m_show_x, m_show_y, m_show_w, m_show_h);
//			}
		}
	}
	/**
	 * 绘制引导
	 * @param g
	 * @param x
	 * @param y
	 */
	public void renderGuide(DWGraphics g, int x, int y) {
		if (m_is_guide) {
			if (DWControlsManager.getInstance() != null) {
				DWControlsManager.getInstance().m_guide_control = this;
				DWControlsManager.getInstance().setGuidePoint(x + m_show_x, y + m_show_y, m_show_w, m_show_h);
			}
//			DWGuideObject guide = DWControlsManager.getInstance().m_guides.getCurrentGuideObject();
//			if (guide != null) {
//				guide.draw(g, x + m_show_x, y + m_show_y, m_show_w, m_show_h);
//			}
		}
	}
	
	public void renderRect(DWGraphics g) {
		if (m_is_rect) {
			g.setColor(Color.WHITE);
			g.setClip(m_show_x - m_touch_pixel_x, m_show_y - m_touch_pixel_y, m_show_w + m_touch_pixel_x * 2, m_show_h + m_touch_pixel_y * 2);
			g.drawRect(m_show_x - m_touch_pixel_x, m_show_y - m_touch_pixel_y, m_show_w - 1 + m_touch_pixel_x * 2, m_show_h - 1 + m_touch_pixel_y * 2);
		}
	}
	
	public void renderLimitsRect(DWGraphics g, int x, int y, int offsetx, int offsety) {
		if (m_is_rect) {
			g.setColor(Color.WHITE);
			g.setClip(x + m_show_x - offsetx - m_touch_pixel_x,
					y + m_show_y - offsety - m_touch_pixel_y,
					m_show_w + m_touch_pixel_x * 2,
					m_show_h + m_touch_pixel_y * 2);
			g.drawRect(x + m_show_x - offsetx - m_touch_pixel_x,
					y + m_show_y - offsety - m_touch_pixel_y,
					m_show_w - 1 + m_touch_pixel_x * 2,
					m_show_h - 1 + m_touch_pixel_y * 2);
		}
	}

	/**
	 * 清理当前控件
	 */
	public void destroy()
	{
		
	}

	public abstract void render(DWGraphics g);

	public abstract void logic();

	public abstract boolean doClick(float pointX, float pointY);

}
